<style>
  /* Inspired by https://www.swyx.io/css-100-bytes */
  html {
    max-width: 70ch;
    padding: 1.5em 0.2em;
    margin: auto;
    line-height: 1.75;
    font-size: 1em;
    color: #24292f;
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
  }

  section {
    margin-bottom: 4em;
  }

  h1 {
    font-size: 2em;
  }

  h2 {
    font-size: 1.5em;
  }

  h3 {
    font-size: 1.25em;
  }

  p, ul, ol {
    margin-top: 0;
    margin-bottom: 0.5em;
  }

  a, a:visited {
    color: #0997cc;
    text-decoration: none;
    font-weight: 500;
  }

  a:hover {
    opacity: 65%;
  }

  img {
    max-width: 100%;
  }

  /* Some css classes */
  .flex {
    display: flex;
  }

  .flex-none {
    flex: none;
  }

  .flex-1 {
    flex: 1;
  }

  .items-center {
    align-items: center;
  }

  .justify-center {
    justify-content: center;
  }

  .flex-wrap {
    flex-wrap: wrap;
  }

  .px-2 {
    padding-left: 0.5em;
    padding-right: 0.5em;
  }

  .mb-1 {
    margin-bottom: 0.25em;
  }

  .mb-2 {
    margin-bottom: 0.5em;
  }

  .mb-4 {
    margin-bottom: 1em;
  }

  .mt-2 {
    margin-top: 0.5em;
  }

  .mt-4 {
    margin-top: 1em;
  }

  .ml-1 {
    margin-left: 0.25em;
  }

  .mr-4 {
    margin-right: 1em;
  }

  .one-line {
    overflow: hidden;
    display: -webkit-box;
    -webkit-line-clamp: 1;
    -webkit-box-orient: vertical;
  }

  .text-sm {
    font-size: 0.8em;
  }

  .text-lg {
    font-size: 1.25em;
  }

  .img-lg {
    max-width: 7.5em;
    border-radius: 0.8em;
    box-shadow: 0.2em 0.2em 0.2em #DCDCDC;
  }

  .img-md {
    max-width: 3.5em;
    border-radius: 0.2em;
    box-shadow: 0.1em 0.1em 0.1em #DCDCDC;
  }

  .img-sm {
    max-width: 1em;
    border-radius: 0.2em;
  }

  .border-t {
    border-top: 1px solid #DCDCDC;
  }

  .border-b {
    border-bottom: 1px solid #DCDCDC;
  }

  .text-center {
    text-align: center;
  }

  .w-full {
    width: 100%;
  }

  .font-bold {
    font-weight: bold;
  }

  @media only screen and (max-width: 600px) {
    .hide-mobile {
      display: none;
    }
  }

  .icon-arrow-left:before {
    content: "←";
  }

  .icon-arrow-right:before {
    content: "→";
  }
</style>

<!-- Lazy load images -->
<style>
  @keyframes backgroundColorPalette {
    0% {
      background: #DCDCDC;
    }
    25% {
      background: #D3D3D3;
    }
    50% {
      background: #778899;
    }
    75% {
      background: #D3D3D3;
    }
    100% {
      background: #DCDCDC;
    }
  }

  .loader {
    width: 100%;
    height: 20em;
    background-color: #DCDCDC;
    animation-name: backgroundColorPalette;
    animation-duration: 10s;
    animation-iteration-count: infinite;
    animation-direction: alternate;
  }
</style>
<script>
  document.addEventListener('DOMContentLoaded', function () {

    let lazyImageObserver = new IntersectionObserver(function (entries, observer) {
      entries.forEach(function (entry) {
        if (entry.isIntersecting) {
          let lazyImage = entry.target;
          const newImage = document.createElement('img');
          newImage.src = lazyImage.dataset.src;
          newImage.onload = function () {
            lazyImage.classList.remove("loader");
            const wrapper = document.createElement('a');
            wrapper.setAttribute('href', newImage.src);
            wrapper.setAttribute('target', "_blank");
            wrapper.appendChild(newImage.cloneNode(true));
            if (lazyImage.parentElement) {
              lazyImage.parentElement.replaceChild(wrapper, lazyImage);
              lazyImage.remove();
            }
          };
          lazyImageObserver.unobserve(lazyImage);
        }
      });
    });

    const images = document.querySelectorAll('img:not([loading=lazy])');
    for (let i = 0; i < images.length; i++) {
      images[i].dataset.src = images[i].src;
      images[i].classList.add('loader');
      images[i].src = "";
      lazyImageObserver.observe(images[i]);
    }

  }, false);

</script>

